Tablo.prototype.tabloGetDOM = function() {
	if (this.hasOwnProperty('DOM')) return this.DOM;

	this.pektisDOM = {};
	this.pektisDOM[1] = $('<div>').addClass('tabloPektis');
	this.pektisDOM[2] = $('<div>').addClass('tabloPektis');
	this.dataDOM = $('<div>').addClass('tabloData');
	this.somaDOM = $('<div>').addClass('tabloSoma');

	this.DOM = $('<div>').addClass('tablo').

	// Υπό κανονικές συνθήκες πρώτα έχουμε τα στοιχεία ταυτότητας
	// του τραπεζιού,

	append(this.dataGetDOM()).

	// ακολουθεί η περιοχή που αφορά τον δεύτερο παίκτη,

	append(this.pektisGetDOM(2)).

	// κατόπιν το σώμα τού ταμπλό με την περιοχή του δεύτερου παίκτη
	// προς το βορρά

	append(this.somaGetDOM()).

	// και κλείνουμε με την περιοχή που αφορά στον πρώτο παίκτη.

	append(this.pektisGetDOM(1));

	return this.DOM;
}

Tablo.prototype.isDOM = function() {
	return this.hasOwnProperty('DOM');
}

Tablo.prototype.oxiDOM = function() {
	return !this.isDOM();
}

Tablo.prototype.dataGetDOM = function(pektis) {
	if (!this.hasOwnProperty('dataDOM')) this.tabloGetDOM();
	return this.dataDOM;
}

Tablo.prototype.pektisGetDOM = function(pektis) {
	if (!this.hasOwnProperty('pektisDOM')) this.tabloGetDOM();
	return this.pektisDOM[pektis];
}

Tablo.prototype.somaGetDOM = function() {
	if (!this.hasOwnProperty('somaDOM')) this.tabloGetDOM();
	return this.somaDOM;
}

// Η μέθοδος "thesiEgo" επιστρέφει τη θέση από την οποία σκοπείται το ταμπλό από
// τον χρήστη. Default θέση θεωρείται η θέση 1.

Tablo.prototype.thesiEgo = function() {
	var trapezi, sinedria, thesi;

	trapezi = this.trapeziGet();
	if (!trapezi) return 1;

	sinedria = trapezi.skinikoFetch().sinedriaEgo();
	if (!sinedria) return 1;

	if (sinedria.trapeziGet() != trapezi.kodikosGet())
	return 1;

	thesi = sinedria.thesiGet();
	if (geister.oxiThesi(thesi)) return 1;

	return thesi;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Tablo.prototype.tabloRefreshDOM = function() {
	this.
	dataRefreshDOM().
	pektisRefreshDOM(1).
	pektisRefreshDOM(2).
	somaRefreshDOM();

	return this;
}

// Ακολουθεί μέθοδος επαναδημιουργίας του DOM element που αφορά στα στοιχεία ταυτότητας
// του τραπεζιού. Η περιοχή αυτή βρίσκεται στο επάνω μέρος και περιέχει συνήθως τον
// κωδικό τραπεζιού και άλλα χρήσιμα στοιχεία ταυτότητας του τραπεζιού.

Tablo.prototype.dataRefreshDOM = function() {
	var tablo = this, dom = this.dataGetDOM(), trapezi, partida, skiniko;

	dom.empty();

	// Αν πρόκειται για ταμπλό τραπεζιού θα εμφανίσουμε στην περιοχή δεδομένων
	// τα στοιχεία ταυτότητας του τραπεζιού.

	trapezi = this.trapeziGet();
	if (trapezi) {
		dom.
		append($('<div>').addClass('tabloDataTrapezi').text(trapezi.kodikosGet()).attr({
			title: 'Κωδικός τραπεζιού',
		})).
		append($('<div>').addClass('tabloDataFasi').text(tablo.fasiGet()).attr({
			title: 'Τρέχουσα φάση παιχνιδιού',
		}));

		partida = trapezi.partidaGet();
		if (partida) dom.append($('<div>').addClass('tabloDataPartida').text(partida.kodikosGet()).attr({
			title: 'Κωδικός παρτίδας',
		}));

		return this;
	}

	// Αν το ταμπλό δεν σχετίζεται με κάποιο τραπέζι, ελέγχουμε το σκηνικό. Αν δεν
	// υφίσταται σκηνικό εμφανίζουμε εικονίδιο φόρτωσης στην περιοχή δεδομένων,
	// καθώς η μόνη περίπτωση να συμβαίνει αυτό είναι όταν φορτώνουμε το σκηνικό.

	skiniko = this.skinikoGet();
	if (!skiniko) {
		dom.append($('<img>').attr({src:'ikona/working/baresPrasino.gif'}).css({height:'10px'}));
		return this;
	}

	// Υπάρχει καθορισμένο σκηνικό για το ταμπλό, αλλά όχι τραπέζι. Σ' αυτή την
	// περίπτωση είμαστε εκτός τραπεζιού και δίνουμε τη δυνατότητα δημιουργίας
	// νέου τραπεζιού με κλικ στην περιοχή δεδομένων.

	dom.addClass('tabloNeoTrapezi').text('Δημιουργήστε τραπέζι').
	on('mouseenter', function(e) {
		$(this).addClass('tabloNeoTrapeziOplisate');
	}).
	on('mouseleave', function(e) {
		$(this).removeClass('tabloNeoTrapeziOplisate');
	}).
	on('click', function(e) {
		e.stopPropagation();
		skiniko.cpliktroGet('trapeziNeo').cpliktroGetDOM().trigger('click');
	});

	return this;
}

// Ακολουθεί μέθοδος επαναδημιουργίας του DOM element της περιοχής παίκτη. Οι περιοχές
// παίκτη βρίσκονται πάνω και κάτω από το ταμπλό, επάνω βρίσκεται η περιοχή τού παίκτη
// στη μια θέση και κάτω η περιοχή τού παίκτη που βρίσκεται στην άλλη θέση. Στην περιοχή
// παίκτη εμφανίζεται αριστερά το όνομα τού παίκτη και δεξιά ο πάγκος με τα φαγωμένα, ή
// μη τοποθετημένα πιόνια του παίκτη.

Tablo.prototype.pektisRefreshDOM = function(pektis) {
	var dom = this.pektisGetDOM(geister.thesiMap(pektis, this.thesiEgo()));

	dom.empty();
	this.onomaPektiDOM(pektis, dom);
	dom.append(this.pagosGet(pektis).pagosRefreshDOM().pagosGetDOM());

	return this;
}

Tablo.prototype.onomaPektiDOM = function(pektis, area) {
	var trapezi = this.trapeziGet(), epomenos = this.epomenosGet(),
		skiniko, sinedria, klasi, onoma, dom, skor, skorDOM;
	if (!trapezi) return this;

	skiniko = trapezi.skinikoFetch();
	klasi = 'tabloPektisOnoma';
	onoma = trapezi.pektisGet(pektis);
	if (onoma) {
		sinedria = skiniko.sinedriaGet(onoma);
		if (!sinedria) klasi += ' offline';
		else if (sinedria.trapeziGet() != trapezi.kodikosGet()) klasi += ' alitevi';
	}
	else {
		onoma = trapezi.telefteosPektis(pektis);
		if (!onoma) return this;
		if (onoma) klasi += ' fevgatos';
	}

	klasi += ' apodoxi' + (trapezi.isApodoxi(pektis) ? 'Nai' : 'Oxi');
	dom = $('<div>').addClass(klasi).text(onoma).pektisOplismos(skiniko, onoma);
	if (epomenos && (pektis == epomenos)) dom.addClass('epomenos');
	area.append(dom);

	skor = trapezi.skor(pektis);
	if (skor) {
		skorDOM = $('<div>').addClass('tabloSkor').text(skor);
		if (skor < (trapezi.skor() - skor)) skorDOM.addClass('tabloSkorXamenos');
		area.append(skorDOM);
	}

	return this;
}

// Η μέθοδος που ακολουθεί επαναδημιουργεί το DOM element του σώματος τού ταμπλό, δηλαδή
// της περιοχής που περιέχει τα τετράγωνα τού ταμπλό.

Tablo.prototype.somaRefreshDOM = function() {
	var trapezi, pektis, tableDOM, rowDOM, rowApo, rowEos, rowStep, colApo, colEos, colStep;

	if (this.thesiEgo() == 1) {
		rowApo = 6;
		rowEos = 0;
		rowStep = -1;
		colApo = 1;
		colEos = 7;
		colStep = 1;
	}
	else {
		rowApo = 1;
		rowEos = 7;
		rowStep = 1;
		colApo = 6;
		colEos = 0;
		colStep = -1;
	}

	// Μας ενδιαφέρει αν μετέχουμε στο τραπέζι ως παίκτες ή όχι. Μετέχουμε ως παίκτες
	// μόνο εφόσον υφίσταται το τραπέζι και καταλαμβάνουμε θέση παίκτη στο τραπέζι.

	trapezi = this.trapeziGet();
	pektis = trapezi ? trapezi.pektisEgo() : false;

	// Το σώμα του ταμπλό υλοποιείται ως HTML table 6x6.
 
	tableDOM = $('<table>').addClass('tabloSomaPinakas');
	for (row = rowApo; row != rowEos; row += rowStep) {
		rowDOM = $('<tr>');
		tableDOM.append(rowDOM);
		for (col = colApo; col != colEos; col += colStep) {
			rowDOM.append($('<td>').append(this.tetragonoGet(row, col).
				tetragonoRefreshDOM(pektis).tetragonoGetDOM()));
		}
	}

	this.somaGetDOM().html(tableDOM);
	this.
	exodosRefreshDOM(pektis, 6, 6).
	exodosRefreshDOM(pektis, 6, 1).
	exodosRefreshDOM(pektis, 1, 1).
	exodosRefreshDOM(pektis, 1, 6);

	return this;
}

Tablo.prototype.exodosRefreshDOM = function(pektis, row, col) {
	var tetragono, pioni, prc, lr, pros = {
		'161': 'Left',
		'166': 'Right',
		'216': 'Left',
		'211': 'Right',
	};

	lr = pros[pektis + '' + row + '' + col];
	if (!lr) return this;

	if (this.epomenosGet() != pektis) return this;

	tetragono = this.tetragonoGet(row, col), pioni;
	if (!tetragono) return this;

	pioni = tetragono.pioniGet();
	if (!pioni) return this;
	if (pioni.isEvil()) return this;
	if (pioni.pektisGet() != pektis) return this;

	tetragono.tetragonoGetDOM().append($('<img>').
	addClass('tabloExodos tabloExodos' + lr).attr({
		src: 'ikona/pexnidi/exodos.png',
		title: 'Έξοδος',
	}).
	on('mouseenter', function() {
		$(this).addClass('tabloExodosOplisate');
	}).
	on('mouseleave', function() {
		$(this).removeClass('tabloExodosOplisate');
	}).
	on('click', function() {
		if ($(this).data('klik')) return;
		$(this).data({'klik':1});
		pioni.ikona('ikona/endixi/asteraki.gif');
		client.node('diafigi', 'rc=' + geister.rc(row, col), function(xhr) {
			$(this).removeData('klik');
			if (xhr.sfalma) return pioni.ikona();
			client.fyi.epano(xhr.responseText);
			if (!xhr.responseText) return;
			pioni.ikona();
		});
	}));

	return this;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Pagos.prototype.pagosGetDOM = function() {
	if (this.hasOwnProperty('DOM')) return this.DOM;

	this.DOM = $('<div>').addClass('tabloPagos').attr({
		title: 'Πάγκος',
	});

	return this.DOM;
}

Pagos.prototype.pagosRefreshDOM = function() {
	var dom = this.pagosGetDOM(), i;

	dom.empty();
	for (i = 0; i < this.pioni.length; i++) {
		dom.prepend(this.pioni[i].pioniRefreshDOM().pioniGetDOM());
	}

	return this;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Tetragono.prototype.tetragonoGetDOM = function() {
	if (this.hasOwnProperty('DOM')) return this.DOM;

	this.DOM = $('<div>').addClass('tetragono');
	return this.DOM;
}

Tetragono.prototype.tetragonoRefreshDOM = function(pexnidi) {
	var dom, pioni;

	dom = this.tetragonoGetDOM();
	dom.html($('<img>').addClass('tetragonoIcon').attr({
		src: 'ikona/pexnidi/tetragono' + (pexnidi ? 'Pexnidi' : '') + '.jpg',
	}));

	pioni = this.pioniGet();
	if (!pioni) return this;

	dom.
	append(pioni.pioniRefreshDOM().pioniGetDOM());

	return this;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Pioni.prototype.pioniGetDOM = function() {
	if (this.hasOwnProperty('DOM')) return this.DOM;

	this.DOM = $('<div>').addClass('pioni');
	return this.DOM;
}

Pioni.prototype.pioniRefreshDOM = function() {
	var tablo, trapezi, skiniko, thesi, pektis = this.pektisGet(), dom = this.pioniGetDOM(), img;

	tablo = this.tabloGet();
	trapezi = tablo ? tablo.trapeziGet() : null;
	if (trapezi) skiniko = trapezi.skinikoFetch();

	// Θέτουμε το στοιχείο θέσης μόνον εφόσον η συνεδρία μας αφορά παίκτη
	// τού παιχνιδιού και μόνο εφόσον το φαντασματάκι βρίσκεται εντός τού
	// ταμπλό.

	thesi = null;
	if (this.tetragonoGet()) {
		if (trapezi) thesi = trapezi.thesiPekti(client.session.pektis);

		// Αν βρισκόμαστε σε φάση διαπραγμάτευσης, τότε ακυρώνουμε το στοιχείο
		// θέσης, ώστε να μην αποκρύπτονται τα φαντασματάκια εφόσον βρίσκονται
		// ακόμη στις αρχικές τους θέσεις.

		if (tablo.isFasi('ΔΙΑΠΡΑΓΜΑΤΕΥΣΗ')) thesi = null;
	}

	// Ετοιμάζουμε την εικόνα του φαντασματακίου. Αν πρόκειται για ξένο
	// φαντασματάκι θα παραμείνει κρυφό, αλλιώς θα εμφανίσουμε «καλό» ή
	// «κακό» φαντασματάκι.

	img = $('<img>');

	// Πρώτη περίπτωση είναι να είμαστε παίκτες στο παιχνίδι και το φαντασματάκι
	// να μην μας ανήκει.

	if (thesi && (pektis != thesi)) img.attr({
		src: 'ikona/pexnidi/pioniA.png',
	});

	// Άλλη περίπτωση είναι να είμαστε θεατές και το φαντασματάκι ενώ είναι ακόμη
	// ενεργό να μην είναι του παίκτη που παρακολουθούμε, οπότε βγαίνει με λίγο πιο
	// αχνά χρώματα.

	else if ((!thesi) && skiniko && tablo.oxiFasi('ΔΙΑΠΡΑΓΜΑΤΕΥΣΗ') &&
		(skiniko.sinedriaEgoFetch().thesiGet() != this.pektisGet()) &&
		this.oxiPagos()) img.attr({
		src: 'ikona/pexnidi/pioniTheatis' + (this.isGood() ? 'B' : 'R') + '.png',
	});

	// Σε κάθε άλλη περίπτωση εμφανίζεται το φαντασματάκι σε όλο του το μεγαλείο.

	else img.attr({
		src: 'ikona/pexnidi/pioni' + (this.isGood() ? 'B' : 'R') + '.png',
	});

	// Αν το φαντασματάκι βρίσκεται στον πάγκο, προσδίδουμε ανάλογα χαρακτηριστικά
	// τόσο στον φορέα του, όσο και στην ίδια την εικόνα.

	if (this.isPagos()) {
		dom.removeClass('pioniTetragono').addClass('pioniPagos');
		img.addClass('pioniPagosIcon');
	}

	// Αν το φαντασματάκι βρίσκεται σε τετράγωνο τού ταμπλό, προσδίδουμε ανάλογα
	// χαρακτηριστικά τόσο στον φορέα του, όσο και στην ίδια την εικόνα.

	else {
		dom.removeClass('pioniPagos').addClass('pioniTetragono');
		img.addClass('pioniTetragonoIcon');
	}

	// Εισάγουμε το στοιχείο εικόνας του φαντασματακίου μέσα στον φορέα του.

	dom.html(img);
	return this;
}

Pioni.prototype.ikona = function(src) {
	var dom = this.pioniGetDOM(), img;

	if (!dom) return this;
	img = dom.find('.pioniTetragonoIcon');
	if (!img.length) img = dom.find('.pioniPagosIcon');
	if (!img.length) return this;

	if (src === undefined) src = img.data('src');
	if (!src) return this;

	img.data('src', img.attr('src'));
	img.attr({src: src});
	return this;
}

// Η μέθοδος "nikitisEndixi" καλείται κατά τη στιγμή που το πιόνι καθίσταται μοιραίο πιόνι,
// είτε επειδή έφαγε το τελευταίο «κακό» φαντασματάκι του αντιπάλου, είτε επειδή έφαγε το
// τελευταίο «καλό» φαντασματάκι του αντιπάλου.

Pioni.prototype.nikitisEndixi  = function(nikitis, skiniko) {
	var
	pektis1 = this.pektisGet(),
	egoThesi = skiniko.sinedriaEgoFetch().thesiGet(),
	dom = this.pioniGetDOM();

	client.ixos.play(egoThesi == nikitis ? 'applause.ogg' : 'daiaiaing.ogg');

	// Στην περίπτωση που το πιόνι που κάνει το «φάγωμα» είναι winner, έχουμε κάποιο
	// check που κάνει εμφανές το γεγονός.

	if (pektis1 == nikitis)
	dom.append($('<img>').addClass('pioniNikitisIcon').attr({src:'ikona/cpanel/apodoxi.png'}).anadisi());

	// Αλλιώς πρόκειται για loser, οπότε το «πατικώνουμε».

	else
	dom.find('.pioniTetragonoIcon').animate({height:'-=20px',top:'+=20px'},1000,'easeOutBounce');

	return this;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Pioni.prototype.siromeno = function() {
	var pioni = this, img, tetragono, tablo, stoxos = null, revDur = 100;

	img = this.pioniGetDOM().find('.pioniTetragonoIcon');
	if (!img.length) return this;

	tetragono = this.tetragonoGet();
	if (!tetragono) return this;

	tablo = tetragono.tabloGet();
	if (!tablo) return this;

	img.siromeno({
		// Αν κατά τη μετακίνηση καθορίστηκε τετράγωνο-στόχος, το πιόνι
		// αφήνεται στη θέση που έχει μετακινηθεί, αλλιώς επιστρέφει στη
		// βάση του.

		revert: function() {
			return !stoxos;
		},

		revertDuration: revDur,

		// Ξεκινώντας τη διαδικασίας μετακίνησης θέτουμε στιλιστικά χαρακτηριστικά
		// στο μετακινούμενο πιόνι και καθαρίζουμε το τετράγωνο-στόχο.

		start: function(e, ui) {
			e.stopPropagation();
			ui.helper.anadisi().addClass('pioniKinisi');
			stoxos = null;
		},

		// Κατά την παύση της μετακίνησης, επαναφέρουμε τα στιλιστικά χαρακτηριστικά
		// τού μετακινούμενου πιονιού και του τετραγώνου αφετηρίας.

		stop: function(e, ui) {
			e.stopPropagation();
			ui.helper.removeClass('pioniKinisi');
			tetragono.tetragonoGetDOM().removeClass('tetragonoAfetiria');
			$('.tetragonoStoxos').removeClass('tetragonoStoxos');
			if (!stoxos) return;

			switch (tablo.fasiFetch()) {

			// Κατά το στήσιμο αποστέλλουμε το μετακινούμενο πιόνι και το τετράγωνο
			// προορισμού.

			case 'ΣΤΗΣΙΜΟ':
			img.data({src:img.attr('src')}).attr({src:'ikona/endixi/asteraki.gif'});
			client.fyi.pano('Αποστολή μετακίνησης. Παρακαλώ περιμένετε…');
			client.node('stisimo', 'pioni=' + pioni.noumeroGet(), 'tetragono=' + stoxos.rcGet(),
			function(xhr) {
				var err = false;
				if (xhr.sfalma) err = true;
				else if (xhr.responseText) {
					err = true;
					client.fyi.spano(xhr.responseText);
				}
				if (!err) return client.fyi.pano();

				img.attr({src:img.data('src')});
				tetragono.tetragonoRefreshDOM().pioniGet().siromeno();
			});
			break;

			// Κατά τη διάρκεια του παιχνιδιού αποστέλλουμε το μετακινούμενο πιόνι
			// και το τετράγωνο προορισμού.

			case 'ΠΑΙΧΝΙΔΙ':
			//img.data({src:img.attr('src')}).attr({src:'ikona/endixi/asteraki.gif'});
			client.fyi.pano('Αποστολή μετακίνησης. Παρακαλώ περιμένετε…');
			client.node('kinisi', 'pioni=' + pioni.noumeroGet(), 'tetragono=' + stoxos.rcGet(),
			function(xhr) {
				var err = false;
				if (xhr.sfalma) err = true;
				else if (xhr.responseText) {
					err = true;
					client.fyi.spano(xhr.responseText);
				}
				if (!err) return client.fyi.pano();

				img.attr({src:img.data('src')});
				tetragono.tetragonoRefreshDOM().pioniGet().siromeno();
			});
			break;

			// Σε οποιαδήποτε άλλη φάση του παιχνιδιού δεν πρέπει να επιτρέπουμε
			// μετακινήσεις πιονιών, οπότε απλώς ακυρώνουμε το τετράγωνο-στόχο.

			default:
			stoxos = null;
			break;
			}
		},

		drag: function(e, ui) {
			var kontino;

			e.stopPropagation();
			$('.tetragonoStoxos').removeClass('tetragonoStoxos');

			kontino = tablo.kontino(ui.offset);
			stoxos = tablo.kontino(ui.offset, tablo.exeresi(tetragono));
			if (!stoxos) return;
			if (stoxos != kontino) return(stoxos = null);

			stoxos.tetragonoGetDOM().addClass('tetragonoStoxos');
		},
	}).

	on('mouseenter', function(e) {
		$(this).addClass('pioniSiromeno');
	}).

	on('mouseleave', function(e) {
		$(this).removeClass('pioniSiromeno');
	}).

	on('mousedown', function(e) {
		e.stopPropagation();
		img.draggable('option', 'containment', tetragono.perioxi());
		tetragono.tetragonoGetDOM().addClass('tetragonoAfetiria');
	});

	return this;
}

// Η μέθοδος "kontino" διατρέχει όλα τα τετράγωνα τού ταμπλό βρίσκει το κοντινότερο
// σε σχέση με το αντικείμενο που δίνουμε ως πρώτη παράμετρο. Αυτό το αντικείμενο
// πρέπει να έχει "top" και "left" attributes που αφορούν θέση ώς προς το document.
// Ως δεύτερη παράμετρο μπορούμε να δώσουμε λίστα δεικτοδοτημένη με τα τετράγωνα
// που ίσως θέλουμε να εξαιρεθούν από τη διαδικασία.

Tablo.prototype.kontino = function(tl, exeresi) {
	var kontino = null, dist;

	if (exeresi === undefined) exeresi = {};
	this.tetragonoWalk(function(rc, tetragono) {
		var d;

		if (exeresi.hasOwnProperty(rc)) return;

		d = globals.apostasiTL(tetragono.tetragonoGetDOM().offset(), tl);
		if (kontino && (dist <= d)) return;

		kontino = tetragono;
		dist = d;
	});

	return kontino;
}

// Η μέθοδος "exeresi" διατρέχει όλα τα τετράγωνα του ταμπλό και τοποθετεί σε λίστα
// τα τετράγωνα στα οποία ΔΕΝ μπορούμε να αποθέσουμε το πιόνι του τετραγώνου που
// περνάμε ως παράμετρο.

Tablo.prototype.exeresi = function(tetragono) {
	var
	pioni1 = tetragono.pioniFetch(),
	pektis1 = pioni1.pektisFetch(),
	xroma1 = pioni1.isGood(),
	row = tetragono.rowGet(),
	col = tetragono.colGet(),
	exeresi = {};

	switch (this.fasiFetch()) {

	// Κατά το στήσιμο των πιονιών ο παίκτης μπορεί να μετακινεί τα πιόνια του
	// σε τετράγωνα που καταλαμβάνουν άλλα δικά του ετερόχρωμα πιόνια και με τον
	// τρόπο αυτό να εναλλάσσει τα δύο πιόνια. Επομένως τα μόνα τετράγωνα που
	// δεν πρέπει να εξαιρεθούν είναι τα «δικά» του τετράγωνα που περιέχουν
	// πιόνια με διαφορετικό χρώμα από το μετακινούμενο.

	case 'ΣΤΗΣΙΜΟ':
		this.tetragonoWalk(function(rc, tetragonoCheck) {
			var pioni, pektis, xroma;

			pioni = tetragonoCheck.pioniGet();
			if (!pioni) return(exeresi[rc] = 1);

			pektis = pioni.pektisGet();
			if (!pektis) return(exeresi[rc] = 1);
			if (pektis != pektis1) return(exeresi[rc] = 1);

			xroma = pioni.isGood();
			if (xroma == xroma1) return(exeresi[rc] = 1);
		});
		break;

	// Κατά τη διάρκεια του παιχνιδιού ο παίκτης μπορεί να μετακινεί τα πιόνια του
	// σε διπλανά τετράγωνα εκτός από τα τετράγωνα που καταλαμβάνουν ήδη άλλα δικά
	// πιόνια.

	case 'ΠΑΙΧΝΙΔΙ':
		this.tetragonoWalk(function(rc, tetragonoCheck) {
			var pioni, pektis, xroma, row1, col1;

			// Εξαιρούμε τα διαγώνια τετράγωνα.

			row1 = tetragonoCheck.rowGet();
			col1 = tetragonoCheck.colGet()
			if ((row1 != row) && (col1 != col)) return(exeresi[rc] = 1);

			// Τα κενά τετράγωνα είναι δεκτά.

			pioni = tetragonoCheck.pioniGet();
			if (!pioni) return;

			// Το πιόνι πρέπει να είναι αντίπαλο.

			pektis = pioni.pektisGet();
			if (!pektis) return(exeresi[rc] = 1);
			if (pektis == pektis1) return(exeresi[rc] = 1);
		});
		break;
	}

	exeresi[tetragono.rcGet()] = 1;
	return exeresi;
}

// Η μέθοδος "perioxi" εφαρμόζεται σε τετράγωνο που περιέχει πιόνι και καθορίζει την
// περιοχή κίνησης του πιονιού. Η περιοχή κίνησης καθορίζεται ανάλογα με τη θέση τού
// παίκτη και τη φάση του παιχνιδιού. Επιστρέφεται containment array.

Tetragono.prototype.perioxi = function() {
	var
	tablo = this.tabloFetch(),
	pioni = this.pioniFetch(),
	pektis = pioni.pektisFetch(),
	tetragonoDOM = this.tetragonoGetDOM(),
	pioniDOM = pioni.pioniGetDOM(),
	row = this.rowGet(), row1,
	col = this.colGet(), col1,
	dx = parseInt(pioniDOM.css('left')),
	dy = parseInt(pioniDOM.css('top')),
	apo, eos;

	switch (tablo.fasiGet()) {

	// Κατά το στήσιμο των πιονών η περιοχή κίνησης περιορίζεται στα τετράγωνα
	// που καταλαμβάνουν τα πιόνια κατά την εκκίνηση της παρτίδας (2x4).

	case 'ΣΤΗΣΙΜΟ':
		if (pektis == 1) {
			apo = tablo.tetragonoGet(2, 2);
			eos = tablo.tetragonoGet(1, 5);
		}
		else {
			apo = tablo.tetragonoGet(5, 5);
			eos = tablo.tetragonoGet(6, 2);
		}
		break;

	// Κατά τη διάρκεια του παιχνιδιού η περιοχή κίνησης περιορίζεται στα διπλανά
	// τετράγωνα του πιονιού.

	case 'ΠΑΙΧΝΙΔΙ':
		if (arguments[0] < 1) arguments[0] = 1;
		else if (arguments[0] > 6) arguments[0] = 6;
		if (arguments[1] < 1) arguments[1] = 1;
		else if (arguments[1] > 6) arguments[1] = 6;
		if (pektis == 1) {
			apo = tablo.tetragonoGet((row == 6 ? row : row + 1), (col == 1 ? col : col - 1));
			eos = tablo.tetragonoGet((row == 1 ? row : row - 1), (col == 6 ? col : col + 1));
		}
		else {
			apo = tablo.tetragonoGet((row == 1 ? row : row - 1), (col == 6 ? col : col + 1));
			eos = tablo.tetragonoGet((row == 6 ? row : row + 1), (col == 1 ? col : col - 1));
		}
		break;

	default:
		apo = this;
		eos = this;
		break;
	}

	apo = apo.tetragonoGetDOM().offset();
	eos = eos.tetragonoGetDOM().offset();

	return [
		apo.left + dx,
		apo.top + dy,
		eos.left + dx,
		eos.top + dy,
	];
}
